<?php

/**
 * 登录认证模型
 *
 * @author JiangJian <silverd@sohu.com>
 * @copyright 2011-2012 xiangle.com
 * $Id: Auth.php 162 2012-11-09 04:04:30Z Jun.Lu.726@gmail.com $
 * @version    2012-02-20  ::  JiangJian  ::  Create File
 */
class Model_System_Auth
{

    /**
     * 获取当前登录用户信息
     *
     * @return array
     */
    public function get()
    {
        if (!isset($_SESSION['authUser']) || empty($_SESSION['authUser'])) {
            return array();
        }
        return $_SESSION['authUser'];
    }

    /**
     * 设置当前 session
     *
     * @param array $authUser
     * @return void
     */
    public function set($authUser = NULL)
    {
        $_SESSION['authUser'] = $authUser;
    }

    /**
     * 登出（清空 session）
     *
     * @param int $adminId
     * @return void
     */
    public function logout()
    {
        $this->set(NULL);

        session_unset();
        session_destroy();
    }

    /**
     * 登录验证（只含验证操作）
     *
     * @param string $fieldValue 字段值
     * @param string $fieldName  字段名
     * @param string/false $password 为 false 表示不需要检测密码
     * @return array/string
     */
    public function login($fieldValue, $fieldName = 'admin_name', $password = false)
    {
        $fieldValue = trim(strip_tags($fieldValue));
        if (empty($fieldValue)) {
            return array(
                'status' => -10,
                'msg'    => '用户名不能为空',
            );
        }

        if (!in_array($fieldName, array('admin_id', 'admin_name', 'email', 'mobile'))) {
            return array(
                'status' => -20,
                'msg'    => 'loginName 登录名字段非法',
            );
        }

        // 是否检测密码
        $password = trim(strip_tags($password));
        $checkPwd = ($password !== false) ? true : false;

        if ($checkPwd && empty($password)) {
            return array(
                'status' => -30,
                'msg'    => '用户名和密码不能为空',
            );
        }

        // 用户信息
        $adminRow = Model('System_Admin')->getRowFull(array($fieldName => $fieldValue));

        if (!$adminRow) {
            return array(
                'status' => -30,
                'msg'    => '该用户不存在',
            );
        }

        if (!$adminRow['status']) {
            return array(
                'status' => -40,
                'msg'    => '该用户已被禁用',
            );
        }

        // 密码错误
        if ($checkPwd && $adminRow['password'] != md5($password)) {

            // 写错误日志
            Com_Log::write('adminErrPassword', "{$fieldName}:{$fieldValue}\t{$password}\t" . Helper_Client::getUserIp());

            return array(
                'status' => -50,
                'msg'    => '密码错误，请重试',
            );
        }

        return array(
            'status' => 1,
            'data'   => $adminRow,
        );
    }

    /**
     * 登陆后续操作（写SESSION、登录日志）
     *
     * @param array $adminRow
     * @return void
     */
    public function loginAfter($adminRow)
    {
        // 更新最后登录信息
        Model('System_Admin')->updateLastLogin($adminRow['admin_id']);

        // 登录日志
        Model('System_LoginLog')->add($adminRow);

        // 写入 session
        $adminRow['last_login'] = time();
        $adminRow['last_ip']    = Helper_Client::getUserIp();
        $this->set($adminRow);
    }

    /**
     * ACL权限检查
     *
     * @param string $myPrivIds 我的权限
     * @param string $module
     * @param string $controller
     * @param string $action
     * @return bool
     */
    public function checkPriv($myPrivIds, $controller, $action)
    {
        // 没有任何权限
        if (!$myPrivIds) {
            return false;
        }

        // 拥有全部权限
        if ($myPrivIds == '-1') {
            return true;
        }

        // 获取当前MCA对应的权限颗粒id
        $privId = Model('System_Privilege')->getPrivByMCA($controller, $action);

        // 权限颗粒未激活，相当于对所有人开放
        if ($privId < 1) {
            return true;
        }

        $myPrivIds = explode(',', trim($myPrivIds, ','));
        return in_array($privId, $myPrivIds);
    }

    /**
     * 指定MCA是否需要检测ACL权限
     *
     * @param string $module
     * @param string $controller
     * @param string $action
     * @return bool
     */
    public function needAuthCheck($controller, $action)
    {
        // 加载配置文件
        if (!isset($GLOBALS['AUTH_CONF'])) {
            Core_Config::load('auth');
        }

        $authConfig = $GLOBALS['AUTH_CONF'];
        // 单个方法不检查权限
        if (isset($authConfig[$controller][$action])) {
            return (bool) $authConfig[$controller][$action];
        }

        // 整个控制器不检查权限
        if (isset($authConfig[$controller]['*'])) {
            return (bool) $authConfig[$controller]['*'];
        }

        // 整个模块下不检查权限
        //     if (isset($authConfig['*']['*'])) {
        //          return (bool) $authConfig['*']['*'];
        //      }

        return true;
    }

}